#ifndef __CATALOGUES__H_
#define __CATALOGUES__H_

#include <map>
#include <vector>
#include <set>
#include <algorithm>
#include <string>
#include <cmath>
#include <regex.h>
//#include "../archives/GenericArchive.h"
#include "../archives/archivoTerminos.h"
#include "../archives/archivoTermDoc.h"
#include "../archives/archivoDocTerm.h"
#include "../archives/archivoNGramas.h"
#include "../archives/archivoIdTerminos.h"
#include "../../tp/staticutils.h"
#include "../archives/archivoDocumentos.h"


class Catalogues {
	
 protected:
	std::string nombre;
	void abrirArchivos();
	void cerrarArchivos();
	archivoTerminos* Terminos;
	archivoIdTerminos* IdTerminos;
	archivoDocumentos* Documentos;
	archivoTermDoc* TermDoc;
        archivoDocTerm* DocTerm;
 	archivoNGramas* NGramas;
	std::vector<std::string> obtenerNGramas(const std::string termino,unsigned N=2);
 	double prodInterno(const std::vector<double> vect1, const std::vector<unsigned> vect2);
 	std::vector<long> calcularAND(const std::vector<long> vect1,const std::vector<long> vect2);
	std::vector<std::string> validarComodines(const std::string expresion, const std::vector<std::string> terminos);
 public:    
 	Catalogues(std::string nombre);
 	~Catalogues();
 	/*
 	 * Elimina toda la base de informacion del catalogo
 	 * (cierra los archivos, los borra y los vuelve a crear)
 	 */
 	 void borrarCatalogo();
 	/*
 	 * Agrega un documento con todos sus terminos
 	 */
 	int agregarDocumento(std::string ruta, std::vector<std::string> terminos);
    /*
 	 * Elimina todas las relaciones del documento con sus terminos
 	 */
    int eliminarDocumento(std::string ruta);
    /*
 	 * Elimina todas las relaciones del documento con sus terminos y
 	 * agrega todos los nuevos terminos del doc
 	 */
    int modificarDocumento(std::string ruta, std::vector<std::string> terminos);
    /*
 	 * Metodo PARA PRUEBAS!
 	 * Muestra todo los terminos y cada doc donde aparecen con su frec
 	 */
    void mostrarTerminosDoc();
    /*
 	 * Metodo PARA PRUEBAS!
 	 * Muestra todo los bigramas con los terminos a donde apuntan
 	 */
    void mostrarBigramas();
    /*
 	 * Realiaza una consulta rankeada
 	 * Devuelve vector con las rutas de los docs ordenada por
 	 * ranking
 	 */
 	std::vector<std::string> rankingQuery(std::vector<std::string> queryTerminos, std::vector<pair<unsigned,char> > relevancia);
    /*
     * A partir de una expresion con comodines obtiene un listado
     * con todos los resultados posibles de terminos que satisfacen
     * la expresion
     */
    std::vector<std::string> getTerminosComodin(std::string expresion);
    /*
     * Busqueda puntual, dada una lista de terminos, devuelve todos
     * los documentos donde aparecen 1 o mas de estas palabras. 
     */
     std::vector<std::string> puntualQuery(std::vector<std::string> queryTerminos);
    
    // Mapa donde se insertan el nombre o tipo de archivo con la clase
    // las claves de este mapa se definen como constantes
    // Ej : #define NGRAMTYPE "ngram" con esto obtenemos el archivo asociado a los NGRAM
    //std::map<std::string,GenericArchive&> archives;
};

#endif // Catalogues_h
